About the concept itself: Elizabeth is one of the encounters in a personal written story of mine . She is the head of the church who hunts down creatures like vampires or other mystical beings under the impression to save humanity this way. Her concept reflects the duality between good and evil. The design is targeted to look like a boss fight from a typical JRPG.
Breakdown
The engine being used is the goo engine which is a branch of blender specialized on NPR creations. With this we have more control over how the render looks in the end especially because you gain more control over different lighting section .
Shading
Base Shader
The main shader being used is split into 2 bigger parts. Both of them together will cover the light breakup , diffuse colors , ambient occlusion , IOR , Roughness , Gloss , Normal map , Specular , Rim and the ability to use ILM (image based light maps) .
Diffuse Rebuilt
The diffuse rebuilt is actually quite simple . Starting with the shader info node of the goo engine we gain control over the separated passes of diffuse , cast shadows , self shadows and ambient lighting . This gives us a lot of control over the overall look. We use some simple math mix nodes to turn the features of the shadows on or off if needed and attach its factor to the group output . With a map range node and little math of subtraction and adding values we create a control like a color ramp. What it does is basically defining the position where light and shadow is separated from each other and the intensity it smooths out . This defines our toon hardening mask .
Afterwards the shadow setup and the toon hardening get combined by a multiply node followed by a color add node to add control over the ambient lighting influence we gain through the shader info node as well .
Fresnel based brightening
For our fresnel based lighting we use a glossy bsdf node. however to ensure an npr look we should ensure that the roughness is at least 0.5 otherwise it would not look hand painted anymore .
For a bit of more control a custom fresnel is used that i use for more control .
Using the output of this node as a factor to balance between pure black and the white values gained from the glossy bsdf node we gain our gloss mask.
The structure of it is fairly simple . we use a bump node and the geometry nodes incoming value to create a roughness effect where the bump details appear according to the roughness intensity given and flowing into the normal value of the standard fresnel node. Untouched the IOR would cause a problem with back facing to fix this we divide 1 by the value of the IOR and balance between the output und the straight up IOR value based on the backfacing value we get from the geometry node.
Ambient Occlusion , ILM and diffuse coloring
With the Ambient Occlusion node we mix it's output value with white and use an input value as a factor to control the influence intensity on the model.
This will give us further light and shadow information for our diffuse mask from earlier that we combine with it via a color darkening node with full intensity. Followed by a color add node on full intensity to add our fresnel based brightening from earlier to it .
Now for the more interesting part the ILM.
First we should know what an ILM is and what it is used for. The ILM is a map that defines lighting situations by texturing them in. This is done by dividing it's output in the different channel.
Commonly the red channel defines sections on the model where shadows are forced to appear regardless of how the light falls. Example for those areas could be the folds of a boob or the lower side of a chin.
The green channel is used for forced highlights. Those parts are always lit . A good example where it is often used are highlights in the hair . I do my highlights differently through an anisotropic effect we will discuss later but i wanted to have the control for my base shader to be able to use it whenever i need it.
The blue and alpha channel can still create solutions for other tasks and are depending heavily from studio to studio to what they contain. usually an AO map and a lineart but in my case both are unused until a special need for them appears. For now they are left empty .
To achieve this functionality we split the image we get into their channels by the seperate color node .
The red values get subtracted and the greens added to our black and white shadow/light mask we created so far.
Lastly we have a mix node for the colors . Input A resembles the shadows while input B are the highlights. Of course you can break it up even more by adding more colors but for simplicity of control we stick to only shadow and lit colors .
Curvature & Rim
With goo engines Curvature node we get access to not just the curvature but also to rim.
For this we create 3 inputs:
Samples - to define how many samples should be generated (usually a sample size of 4 suffices but you might wanna cramp it up for certain use cases . be warry though high sample rates lead into very high render times)
Sample radius - as the name suggest it's the influence radius of the sample
thickness - how thick the lines are that are being drawn.
For the Rim we create an additional input for the invert effect we might wanna have.
Using an invert color node and the factor of our input we can mix the rim on top of true black to get our rim mask .
With an add node we can add the curvature on top of it . there is a toggle though with some math to completely turn off curvature when it's value is 0 . This is necessary cause on organic objects it would create a weird wireframe like look if not turned off appropriately which we definitely not want.
The now created mask gets color dodged with our shadow/light inputs from before . A mix node then adds the rims color to it .
With that a basic shader would already be done but let's add some more features to the shader .
Global world light
Since this is another custom node we need to transfer the base colors created with the earlier shading to the addon shader we create now . this is done by the multiply node all the the right .
The custom node World light is fairly simple it's just an rgb node that gets multiplied with a value for it's strength and put out as the combination of it as world light , the chosen color itself , and the strength value it got multiplied with. This setup alone does only make sense to have one area where you setup the situation for the entire worlds lighting and has no other benefits beyond that . So it is basically just a quality of life thing added to the shader.
Gloss & Specular
The glossiness is done fairly simple . Taking a Glossy bsdf node and translating it to color information with the shader to rgb node already gives us the necessary glossiness mask . the color override node is yet another quality of live feature.
It checks if the shadow color is not true black and if it is takes the lit color instead . It also makes sure that the value of the shadow color is the same as the lit color . this ensures we have a tint effect and not a direct shadowing happening. With an additional factor we control how big the difference between both is .
Back to our gloss node the gloss mask is this exact factor deciding over it and the result gets multiplied on top of our world light . Finally it gets mixed with the custom fresnel node from earlier and added on top of our base color.
As for the Specular we use the Layer weight node with a blend and normal value to determine by it's facing value how much a face is looking directly at us . We control the contrast of the output by adding a brightness/contrast node and having the contrast value being used as an input. The result then gets translated as the color value of the glossy bsdf node and converted to color information by the shader to rgb node.
Now we have our Specular mask which is our factor for another mix node of true black and a chosen specular color . Now we only need to add it to our base color and the base shader is done.
Anisotropic
To add highlights to the hair we create an anisotropic effect. The concept is simple we have 2 frequencies creating the wiggly lines and another to break it up in spots.
let's look at the frequencies first
Input for all of those frequencies is the uv information of the texture coordinate splitted into it's axis values. we take only the X information for the noise vectors above.
For the Low frequency we have a roughness of 1 and a distortion of 5 , the high frequency has a roughness of 1 but a distortion of 10.
Both frequency get the contrast changed by -0.9 and the new found value subtracted by 0.5 . this will create our wiggly lines when added with a math node to the uvs Y value.
For more control both the high and low frequencies scale of the noise texture will be added to our inputs.
The spottiness setup is similar to the low frequency but we do not add the scale as an input . we set the scale to 22, the roughness to 1 and the distortion to 5 . What we do control by the inputs is the brightness we manipulate with the brightness/contrast node. We need a quite sharp contrast in general so a value of 10 in contrast should do the trick.
let's put the spottiness aside for a bit and focus on the frequencies.
Right now we only would have lines but they would not move by the camera angle like an anisotropic effect would do .
To achieve that we need the Vector transform node on the vector tab. we need to translate the worlds vector to the camera vector and influence the Z value by -1 . We only need the Z value to have the strength controlled by it so we add another separate XYZ node and multiply it's output by an input we set. This input will define the offset of the camera angle . The Y value from earlier gets now subtracted by this strength.
From here we have the frequency moving up and down to the angle but with a ramp we can control the position and size of the effect but instead of a color ramp we use a two map ranges to have the control from outside .
we create 2 float values one for the position and one for the effect size. for the starting point of our range we subtract the position from the size .
The center value is build up by the position value and the end is the size added to the position.
To create a sharp mask we add 2 mix nodes flowing into each other to create its transition. both end and start color needs to be true black while the center is true white .
now with our anisotropic mask done we multiply it to our spottiness frequency line created earlier.
we want to have the effect to only show up where the light shines upon . For that we use a specular bsdf that is fed with the roughness value from our base shader and translate it to color data with the shader to rgb node. we only need the gray information of it so we split it with the seperate to rgb node and take any channel of it in this case i just took the red channel but any other would do as well.
This output we then multiply on our anisotropic effect and use it as a base value for two splitups . one is straight up just a halfening of both values so a color ramp set to constant and put to 0.5 for the white value does its trick.
the other is a fine tuning for the spottiness i used a range here since its more easy to read . an end value is what defines the look and depends on what look you want to achieve . its a value you never change once setup correctly so it will no need to function as an input .
both inputs get mixed with a mix node and a factor determines which input is dominating to what level of influence.
Lastly for an opacity control we subtract an input value from 1 to have it work the way intended and mix the former output with true black via a mix node followed by another mix node to add the colors to it . A is the basecolor from our base shading while B is our highlight color . We dock both of those values to our input node and name them accordingly.
And that's it . The anisotropic hair effect is done.
Important note
In order for the effect to work the UVs of the hair mesh need to be squarified . There is a plugin called UVSquare that makes this progress a lot faster. the github is the free version of it but if you like it ensure to support the creator by buying it from the blendermarket instead.
Eye
All of the eye shading evolves around the UV output of the texture coordinate node. The most complex one is the iris so lets take a look at that one first.
We use a gradient texture on linear for the break up but position it with a map range . this will form the lower color of our eye . a min value of 0.6 and a max of 0 creates the shape we want. for the range we need the length node which vector is added -0.5 for the x to center it and -0.2 for the y to lower it to the bottom of the iris.
To get a more feathery effect we add a voronoi texture and invert its color output . but we also break it up by combining the texture coordinates object value with a noise texture on a small scale of 0.4 . the color node combining it has it's factor set to 0.04 cause we just want a very slight breakup of the voronoi textures influence.
the mix node combining our gradient and voronoi should be set up to a ratio of 3 to 1 so the value for the factor needs to be 0.25
With several map ranges we then break up the eye in different threshold areas to color . all those map ranges should be set to smoother step .
The inputs Upper, Center Upper, Center Lower and Lower define the areas threshold borders .with as many mix nodes as we have map ranges we then add our colors to breakups
With the Iris done next we look at the pupil
to control the shape we have 2 subtracts for the X and Y value of the shape. this way we can make the pupil be a standard human eye or shape it to a cat or frog eye as well . To do that we of course need to create a vector so the results of our simple math will be combined to one by using the combine xyz node. since we are in UV we do not need the z value and set it up to 0 .
We multiply this with another vector that is coming straight from the uv but to center the pupil we need to subtract 0.5 in x and y . I solved this by using a vector math add node and added a vector of -0.5 , -0.5 , 0 to it . Again we take the multiplied result as an input for our length node and take the value from there to the map range put on stepped linear . With the from max value we can control the size of the pupil and parse it to the input for more control.
Finally we combine Iris and Pupil with a mix node where the output of our pupil is our factor and an additional color as A input while our iris is the B input .
The final step is an outline around the eye.
For that we take the UV vector and center it by adding -0.5 , -0.5 , 0 to it once again . Channeling the output to the length again and going from there to a map range on stepped linear once again. The values are static we want the outline to appear at 85% of our gradient so we put 0.85 as the from max value .
Additionally we check if the output given is greater than 0 and mixing the outcome with a mix node as its factor.
This time A will define the combination of iris and pupil while B is put on top as its own color defined by our input node.
With that the eye shader is done.
Modeling
Eye
For an anime look the eye works very differently from their realistic counterparts . the eyelashes are solid objects not hair cards they follow the mesh lines around the eye. The eye socket is the scalera at the same time you achieve that look by using an emission shader and set it to white. the little shape on top of the eye and right below the top eye lash is a mesh that's sole purpose is to act as a shadow on the eye since we lose any shadows on purpose by using an emission shader . For the iris we have shapes on top of it acting as a highlight . those highlights are getting the same white emission shader as the scalera to solve their purpose as a highlight effect.
The Iris itself is a concave plate shape this way we get some depth into the eye when we look at it from the sides .
Mouth
Another special topology is the mouth. While the lips themselves can have the same shape as realistic ones the surroundings do not . But why?
Why do we have less loops around the face than in realistic pbr models ? The answer is simple : deformation necessities .
To be able to do extreme mouth shapes like for example a dragon ball like scream or an extreme wide grin we have to have less topology information on those spots so the deformation of the rig applies correctly without breaking the shading by forming sharp edges.
Another difference is the nose forming a triangular simplified shape without nostrils but depending on the style you are going for you may add a more realistic nose ... for the general anime style however this is the shape to go for .
Ghost claws
For an anime style silhouettes are important so for the claw to look demonic in shape the parts of the fingers have to flow sharp and also add a few spikes along the line to add to the creepiness of being demonic . so a mix of a birds claw and a human hand as reference was doing the trick here. In the end the result turned out to look very similar to Velvet Crowes demon hand from the game Tales of Berseria . Therefore i assume they did a similar approach to it . But having it look so similar to each other was a great satisfaction because it is a great game in an anime style.
Body Eyes
The body eyes for that eldritch look are done in a more realistic way solely because it works best from all angles. however the created eye socket had to be integrated into the chest and arm for it to work and required quite some adjustments to the surrounding topologies.
When those eyes move around rapidly and randomly it adds a lot to the demonic and creepy value of the false god appearance i was aiming for.
Hair
The hair is constructed by 3 shapes. one front one back and a side bangs part on top of the seams where both come together.
Through the flat shading they appear as one even though they are not but having them separated is crucial for its uv layout and the anisotropic effect to work.
Wings
For the typical anime look instead of cards for each feather we have solid objects to define the silhouette and look of everything. this is necessary to have a believable hand drawn look . Cards even when stylized in look would give away that the overall look is 3D and would ruin the immersion but with solid shapes looking like an artist would have simplified the looks for animation sake it directly gets more believable to be hand drawn.
Tentacles
For the tentacles we actually have a simple geonode setup.
we begin by resampling the curve length by an input that defines the fall of of the thickness and setting a radius coming from the spline parameter factor defined by a curve. this will give us the tapering we want.
with another spline parameter and a capture attribute we define a mask we will use later .
with the curve to mesh node we define how the spline we are using is shaped in the end . we use a simple curve node for this and define the radius by our input with another capture attribute we create a mask for our selection later on .
With the dual mesh node we turn faces to vertices and vice versa . this will create additional meshes but also will turn our selection of vertices to a selection of faces which will come in handy. back to the capture attribute node at the circle we use a combine xyz node cause we want a vector of only the x values . This we put into a greater than and lesser than equal node and put both its B-values to the same value . in my case 0.5
now the magic can begin .
We add several extrude mesh nodes and fill it with our lesser than equal selection from the circle earlier . this way we can extrude the lower part of the tentacle outwards to give it some thickness.
The other capture attribute node will also flow into a combine xyz node and we only focus on the Y value here . The output is then controlled by a float curve and multiplied by 0.1 . this mask will create the base of the suckers.
For the suckers themselves we will use the extrude and scale method multiple times so lets create a node for it .
The basic is simple we have an extrude node and a scale node influencing each other. the selection input value will define where it is created and the scale and offset scale will define the shape. with that we create the starting ground to extrude from again . Later on though some of the faces will be flipped so we need to take care of that as well . For this we use the flip node and enter a boolean value from the outside.
If true it takes the output from the flip faces node if false it behaves like nothing happened . we need to put this to both the very beginning and the very end of the node otherwise we end up with wrong topology.
Back to our tentacle setup we use this extrude scale node 4 times each time using the top value of the previous node as a mask. Lastly we do another extrude node for the upper side and give it some thickness.
last but not least we set the materials with our selections from before , subdivide the mash and shading it smooth on face value.
To add some randomness we apply a random value node each to the first 3 extrusions we do . this will create a more believable variety in shape . adjust the values of those random nodes to your likings just make sure that max is always higher than the min value.
Remember our flip faces toggle from before? on the last extrude scale node we want to toggle this so we have all our faces facing the correct direction and no inverse normal appears.
Walls
For the Walls i created a modular setup , stitched them together how i liked it and since the arena the scene takes place in is circular added a circle curve surrounding the floor to it . On the wall itself i used the curve modifier to make the wall follow the circular shape .
For the parts itself the most complex one is the window . i modeled a triquerta as the symbolism shape you see in the bigger and smaller circular window parts and for the rest followed the shape of a stereotypical gothic window you see in many cathedrals.
For the damage in the walls its a cube subdivided into a dense sphere to have equal faces everywhere. Then deformed with a displace modifier and a cloud texture and finally subtracted from the mesh with a boolean modifier . this way we have a quick and good looking damage result that also follows a good topology of quadratic faces. here and there though it might appear that some clean up is necessary but i only had 2 cases where i needed to do so .
I used the same technique on one window to have a damaged window floating in the air for the magical disturbing appearance of the atmosphere .
For the Debris on the ground i used a sphere and the cell fracture addon that comes with blender to destroy the mesh in seperate parts. With influence on individual i scaled down each part till i see a tiny gap and then gave each a rigid body physics influence on active . i gave the floor a rigid body on passive and let the simulation scatter it over the ground . the result i applied and those parts that outside of the arena i took and separated as the floating debris in the air . The others where joined together , scaled down and placed on various points in the wall where a hole appears.
Bell
The bell is a very simple shape made from a circular curve and extruded several times into shape and with the solidify modifier got its thickness.
the damage to the bell is also done with the same boolean modifier approach from earlier . since it is a static object with flat shading it is forgiving to have some faces be of 5 verices. so we actually can ignore them for our result cause the triangulation that happens afterwards will still keep the shape. But it is always important to know exactly when you are allowed to have those and when not. In general a rule of thumb is to always go for quads. In this case we are lucky and don't need to adjust. it to quads or manually triangulated faces.
Composition
The composition is fairly simple. One layer is just the night sky , another is the moon which i took twice one with a heavy blur to simulate a fake glow and another with a kuwahara filter applied to it to give it a more painterly feel. For those who do not know the kuwahara filter it works like the oil paint filter in many photo editing softwares.
Then the clouds are layered on top of it followed by the environment structure.
The character is denoised because of the alpha hashed being used for the transparency. Also just beneath the model the floor is duplicated and raised just a tiny amount and instead of the ground texture it has a shadow catcher material that just displays the shadow and nothing more .
At the very end of comp 2 color balance nodes where added one is only adding the tint of red and the factor is lowered down till it has the look of redish moon light we want.
The last color balance is correcting the slope just a little to give the colors more impact.